08 视频:入门篇实操总结

你好,我是Chrono。

今天的课程和前面的不太一样,变成了视频的形式。之前也讲过很多次学习Kubernetes要以动手实操为主,加上专栏里单纯的文字配图的形式还是不太直观,所以每到一个学习阶段,我们就会来一个视频总结,把之前学习的内容以视频的形式展现出来,这样也许会让学习的效果更好。

这次视频课程的主要内容和第7讲差不多,是对“入门篇”的回顾与总结,但侧重点是对Docker的实际操作,不会再重复讲那些理论知识。每个视频后都会附上操作要点,供你快速定位和做笔记。

好了,我们正式开始吧。


一. 熟悉Docker的使用

视频操作要点:

首先来操作一下Docker Engine。

(有了[课前准备]的基础)在这台机器上,Docker已经安装好了,我给你用 docker versiondocker info 看一下它的信息。

docker version 显示的是Docker Engine 20.10.12,系统是Linux,硬件架构是arm64,也就是Apple M1。

docker info 显示的是当前系统相关的信息,例如CPU、内存、容器数量、镜像数量、容器运行时、存储文件系统等等。这里存储用的文件系统是overlay2,Linux内核是5.13,操作系统是Ubuntu 22.04 Jammy Jellyfish,硬件是aarch64,两个CPU,内存4G。

现在我们用 docker ps 看一下容器列表,应该是空的。

然后用 docker pull 拉取busybox镜像,再用 docker images 看镜像列表。

使用 docker run 启动busybox镜像,执行最简单的hello world:

docker run busybox echo hello world

然后再用 docker ps -a 查看已经结束的容器列表,应该可以看到刚刚运行完毕的Busybox容器,可以用 docker rm 再加上容器ID删除它。

二. 镜像和容器

视频操作要点:

我们再来拉取另一个镜像,操作系统Alpine:

docker pull alpine

然后用 docker run,加上it参数,运行它里面的shell:

docker run -it alpine sh

这样就暂时离开当前的Ubuntu操作系统,进入了容器内部的Alpine系统,可以在里面执行任意的命令,比如 cat /etc/os-release

这个容器环境与外面是完全隔离的,进程、文件系统都独立,不过也有没有隔离的部分,比如时间和内核。

使用exit退出容器,然后在宿主机环境执行date、uname -a,你就可以看到它与容器里是一致的。

让我们再运行一个容器:

docker run -d --rm nginx:alpine

在宿主机里用 ps -ef|grep nginx 可以看到有3个Nginx进程,它们其实就是容器里的Nginx进程,用docker stop停止后再用ps,就能发现它们已经消失了。

这就证明,容器其实就是操作系统里的进程,只是被容器运行环境加上了namespace、cgroup、chroot的限制,所以容器和普通进程在资源的使用方面是没有什么区别的,也因为没有虚拟机的成本,启动更迅速,资源利用率也就更高。

三. 构建自己的镜像

视频操作要点:

现在让我们来尝试编写Dockerfile,构建一个自己的镜像。

这个Dockerfile先用arg指令定义了IMAGE_BASE、IMAGE_TAG两个变量,然后使用from指令指定了构建的基础镜像,把这两个变量结合起来就是 nginx:1.21-alpine

后面的两个env指令定义了PATH和DEBUG两个环境变量。arg指令定义的变量只能在构建镜像的时候使用,而env定义的变量则会在容器运行的时候以环境变量的形式出现,让进程运行时使用。

接下来是copy指令,它会把构建上下文里的./default.conf拷贝到镜像的/etc/nginx/conf.d/,注意copy指令不能使用绝对路径,必须是构建上下文的相对路径,而且Docker会把构建上下文里的所有文件打包传递给docker daemon,所有尽量只包含必要的文件。

run指令就是构建镜像时要执行的shell命令,可以是安装软件、创建目录、编译程序等等,这里只是简单地用echo命令生成了一个文本文件。

最后两条指令是 exposeworkdirexpose 是声明容器对外服务的端口号,而 workdir 是容器的工作目录。

了解了Dockerfile的内容之后,我们就要用 docker build 来构建镜像了,使用 -t 打上标签,再加上构建上下文路径,当前目录就用一个点号 .

docker build -t ngx-app:1.0 .

构建完成,生成镜像文件,我们可以用 docker run 从镜像启动容器,验证镜像里的文件是否正确生成:

docker run -it --rm ngx-app:1.0 sh

然后我们还可以用 docker save/load 命令把它导出成压缩包,方便保存和传输:

docker save ngx-app:1.0 -o ngx.tar
docker load -i ngx.tar

四. 与外部系统互通的操作

视频操作要点:

接下来我们看看容器与外部系统互通的一些操作。

首先是 docker cp 命令。让我们先启动一个Redis容器:

docker run -d --rm redis

然后用 echo 命令生成一个简单的文本文件:

echo 'aaa' > a.txt

docker ps 命令看看容器的ID,就可以使用 docker cp 命令把这个文件拷贝进容器里了:

docker cp a.txt 062:/tmp

使用 docker exec 可以进入容器内部,查看文件是否已经正确拷贝:

docker exec -it 062 sh
ls /tmp

退出容器,我们再把这个文件改个名字,拷贝出来:

docker cp 062:/tmp/a.txt ./b.txt

现在我们再看看用 -v 参数直接挂载本地目录,把文件直接映射到容器内部:

docker run -d --rm -v /tmp:/tmp redis

docker exec 进入容器,查看一下容器内的“/tmp”目录,应该就可以看到文件与宿主机是完全一致的。

docker exec -it b5a sh    # b5a是容器ID

-p 参数是映射本机端口到容器端口,我们启动一个Nginx容器,把本机的80端口映射到容器的80端口:

docker run -d -p 80:80 --rm nginx:alpine

docker ps 可以看到端口的映射情况,我们也可以使用curl直接访问容器里的Nginx服务:

curl 127.1:80   -I

再使用exec就可以看到容器里的网卡情况:

docker exec xxx ip addr

可以发现容器里的网卡设置与宿主机完全不同,eth0是一个虚拟网卡,IP地址是B类私有地址“172.17.0.2”。

五. 搭建WordPress

视频操作要点:

最后演示一下使用Docker搭建WordPress的过程。

因为在Docker命令里写环境变量很麻烦,命令很长,所以我把搭建的过程写成了一个脚本。

一共有三条命令,首先启动MariaDB,设置数据库名、用户名、密码等环境变量,然后启动WordPress,使用刚才的MariaDB的用户名、密码,db_host必须是MariaDB的IP地址,然后再启动Nginx,它需要在配置文件里指定WordPress的地址,然后用-v参数挂载进容器里。

执行这个脚本之后,我们用 docker ps 看一下容器的状态。

确认容器都运行正常,我们就可以在浏览器里输入IP地址,访问WordPress网站了。

课下作业

今天是动手操作课,作业就是一定记得让自己实际上手操作一遍哦。

欢迎在留言区分享自己的实操感受,如果有什么疑问也欢迎留言分享参与讨论。我们下节课初级篇见。